package com.dtx.visitor;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * Directory类是表示文件夹的类。与Composite模式中的Directory类相比,本章中的Directory类中增加了下面两个方法。
 * 第一个方法是iterator方法。iterator方法会返回Iterator,我们可以使用它遍历文件夹中的所有目录条目(文件和文件夹)。
 * 第二个方法当然就是accept方法了。与File类中的accept方法调用了visit(File)方法一样,Directory类中的accept方法
 * 调用了visit(Directory)方法。这样就可以告诉访问者"当前正在访问的是Directory类的实例"。
 */
public class Directory extends Entry{

    /**
     * 文件夹名字
     */
    private String name;

    /**
     * 目录条目集合
     */
    private List<Entry> dir = new ArrayList<>();

    /**
     * 构造函数
     * @param name
     */
    public Directory(String name) {
        this.name = name;
    }

    /**
     * 接受访问者的访问
     * @param visitor
     */
    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }

    /**
     * 获取名字
     * @return
     */
    @Override
    public String getName() {
        return name;
    }

    /**
     * 获取大小
     * @return
     */
    @Override
    public Integer getSize() {

        int size = 0;

        Iterator<Entry> it = dir.iterator();
        while (it.hasNext()) {
            Entry entry = it.next();
            size += entry.getSize();
        }
        return size;
    }

    /**
     * 增加目录条目
     * @param entry
     * @return
     * @throws FileTreatmentException
     */
    @Override
    public Entry add(Entry entry) throws FileTreatmentException {
        dir.add(entry);
        return this;
    }

    /**
     * 生成Iterator
     * @return
     */
    public Iterator<Entry> iterator(){
        return dir.iterator();
    }
}
